//
// Created by wk on 2024/1/2.
//

#ifndef FILEENCRYPTUTILS_ENCRYPTDES_H
#define FILEENCRYPTUTILS_ENCRYPTDES_H
#include "EncryptInterface.h"
#include "openssl/des.h"

#define EKTV_FLAGS          'ektv'
#define EKTV_ENCRYPT_HEADER 960
#define EKTV_BLOCK_BYTES    8192
#define EKTV_MAX_SWAP_BYTES 128
#define EKTV_MAX_SWAP_BLOCK 8192

typedef enum {
    FALSE,
    TRUE
} BOOL;

typedef struct {/*des*/
    off32_u hkey;
    off32_u flags;        // EKTV 标志
    off32_u ver;            //版本号
    char md5[16];        //原始文件md5
    BOOL time_valid;    //是否开启有效时间控制
    off32_u e_time;        // 加密时间
    BOOL is_customer;    // 是否是场所自用加密
    char name[64];        // 专用场所名称
    off64_t f_size;        // 原始文件大小
    off64_t e_size;        // 加密后的文件大小
    off32_u d_begin;        // 原始文件开始位置
    off32_u d_bytes;        // 加密字节数
    off32_u encrypt;        // 块加密算法
    off32_u shuffle;        // 乱序方式
    off32_u block;        // 块备份方式
    off32_u order[3];        // 加密步骤
    off8_u rsvd[64];
    off8_u keys[8192];    // 数据密钥
    off8_u block_keys[8192];    // 备份数据块密钥
} EKTVData;

typedef struct ENC_DES {
    DES_key_schedule des;/*DES*/
    EKTVData des_fmt;
    off64_t m_blk_pos;

//	pfn m_pTransBlock[3];
    void (*m_pTransBlock[3])(off64_t, int, char *, struct ENC_DES *);

    char m_pBlock[1024 * 1024];
    char m_blk[EKTV_BLOCK_BYTES];
} ENC_DES;

class EncryptDes : public  IDecryptType{
public:
    EncryptDes();

    virtual ~EncryptDes();

    virtual bool isEncryptType(FILE *inputFile);


    private:
    struct ENC_DES mEncDes;
};


#endif //FILEENCRYPTUTILS_ENCRYPTDES_H
